import time
from PySide6.QtCore import QThread, Signal

class BaseWorker(QThread):
    """
    一个通用的工作线程基类。
    它处理基本的计时、异常处理和信号发射。
    子类应实现 `core_run` 方法来执行具体任务。
    """
    progress = Signal(str)
    error = Signal(str)
    
    # finished 信号包含成功状态和总耗时
    finished = Signal(bool, float) # 成功/失败, 总耗时

    def __init__(self, *args, **kwargs):
        super().__init__()
        self._is_stopped = False

    def run(self):
        """
        管理任务执行、计时和信号发射。
        子类应该重写 core_run 方法而不是这个方法。
        """
        start_time = time.time()
        success = False
        try:
            self.core_run()
            if not self.isInterruptionRequested():
                success = True
        except Exception as e:
            if not self.isInterruptionRequested():
                self.error.emit(str(e))
            # 发生异常，任务失败
            success = False
        finally:
            # 确保 finished 信号总是被发射
            total_time = time.time() - start_time
            self.finished.emit(success, total_time)

    def core_run(self):
        """
        子类需要实现这个方法来执行它们的具体任务。
        """
        raise NotImplementedError("Subclasses must implement the core_run method.")

    def stop(self):
        self.requestInterruption()
